/**
 * 通用工具类
 * @version 1.0.1
 */

/**
 * 数组求和
 * @param {Array} arr 
 * @returns 
 */
export function arraySum(arr) {
	if (!arr || arr.length == 0) {
		return 0;
	}
	if (typeof (arr) == 'string') {
		arr = arr.split(' ');
	}
	return arr.reduce((a, b) => {
		return parseInt(a) + parseInt(b)
	})
}

/**
 * 数组去重
 * @param {Array} arr 
 * @param {String} objKey 去重对象的键名
 * @returns 
 * @example 
 * arrayUnique([{a:1},{a:2},{a:3},{a:2}], 'a'); // 复杂数组去重
 * arrayUnique([1,2,3,2]); // 简单数组去重
 */
export function arrayUnique(arr, objKey = '') {
	if (objKey) {
		return [...new Map(arr.map(item => [item[objKey], item])).values()];
	}
	return [...new Set(arr)];
}

/**
 * 从数组随机取出指定数量的元素
 * @param {Array} arr 
 * @param {Number} num 
 * @returns 
 */
export function arrayRandom(arr, num = 1) {
	if (num == 1) {
		return arr[Math.floor(Math.random() * arr.length)];
	}
	return [...arr].sort(() => 0.5 - Math.random()).slice(0, num);
}

/**
 * 判断数值是否在某范围
 * @param {Number} num 数值
 * @param {Array} range 数值范围，示例：[min, max]
 * @returns {Boolean}
 */
export function inRange(num, range) {
	num = parseInt(num);
	const [min, max] = range.split('-').map(v => parseInt(v));
	return num >= min && num <= max;
}

/**
 * 将数组切割成小数组
 * @param {Array} arr 
 * @param {Number} size 
 */
export function arrayChunk(arr, size) {
	const list = [];
	for (let i = 0; i < arr.length; i += size) {
		list.push(arr.slice(i, i + size));
	}
}

/**
 * 快速计算二维数组的组合数量
 * 用途：快速计算购物车的号码组合数量
 * @param {Array} arr 
 */
export function combinationCount(data) {
	let n = 1;
	data.forEach(arr => {
		n = n * arr.length;
	})
	return n;
}

/**
 * 计算阶乘
 * @param {Number} n 
 * @returns 
 */
export function factorial(n) {
	let ans = 1;
	if (n == 0) {
		return 1;
	}
	for (let i = 2; i <= n; i++) {
		ans = ans * i;
	}
	return ans;
}

/**
 * 复制到粘贴板
 * @param {String} text 
 */
export function copyText(text) {
	if (navigator?.clipboard) {
		// Chrome 浏览器规定，只有 HTTPS 协议的页面才能使用这个 API。不过，开发环境（localhost）允许使用非加密协议。
		// link: https://www.ruanyifeng.com/blog/2021/01/clipboard-api.html
		navigator.clipboard.writeText(text);
		return;
	}
	if (window?.document) {
		let elInput = document.createElement('textarea');
		elInput.value = text;
		document.body.appendChild(elInput);
		elInput.select();
		document.execCommand('copy');
		document.body.removeChild(elInput);
		return;
	}
	uni.setClipboardData({
		data: text,
	})
}
export function message(data, message = 'success', code = 200) {
	return {
		data,
		message,
		code
	};
}
